package camid.distribution.activeobject;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;

public class ObjectTask implements Callable<Object>{

	private Object entity;
	
	private String method;
	
	private Object[] params;
	
	public ObjectTask(Object entity, String method, Object[] parameters) {
		this.entity = entity;
		this.method = method;
		this.params = parameters;
	}

//	public Object call() 
//	{
//		try
//		{
//			if( entity instanceof Calculator )
//			{
//				Calculator calc = (Calculator) entity;
//				if(method.equals("sum"))
//				{
//					
//					return calc.sum((Integer)parameters[0], (Integer)parameters[1]);
//				}
//				if(method.equals("sub"))
//				{
//					return calc.sub((Integer)parameters[0], (Integer)parameters[1]);
//				}
//				if(method.equals("div"))
//				{
//					return calc.div((Integer)parameters[0], (Integer)parameters[1]);
//				}
//			}
//			if( entity instanceof IntegerBuffer )
//			{
//				IntegerBuffer buffer = (IntegerBuffer) entity;
//				if(method.equals("set"))
//				{
//					buffer.set((Integer)parameters[0]);
//					return null;
//				}
//				if(method.equals("get"))
//				{
//					return buffer.get();
//				}
//			}
//		}
//		catch(Exception e)
//		{
//			return e;
//		}
//		return null;
//	}
	
	public Object call()
	{
		try {
			boolean evaluated = false;
			Object result = null;
			
			Method[] methods = this.entity.getClass().getMethods();
			for(Method m : methods)
			{
				if(method.equals(m.getName()))
				{
					Class<?>[] concreteParamDefs = m.getParameterTypes();
					if((params == null && concreteParamDefs.length == 0) || (params.length == concreteParamDefs.length))
					{
						boolean match = true;
						for(int i = 0; i < concreteParamDefs.length; i++)
						{
							match = concreteParamDefs[i].isAssignableFrom(params[i].getClass());
						}
						if(match)
						{
							result = m.invoke(entity, params);
							evaluated = true;
						}
					}
				}
				if(evaluated)
					break;
			}
			
			return result;
		}
		catch(Exception e)
		{
			return e;
		}
	}

}